AOP 面向切面编程
AOP 简介
- AOP 为 Aspect Oriented Programming 的缩写,意为:面向切面编程
- 通过
预编译方式
和运行期动态代理
实现
- 在 Spring 中,通过
动态代理
和动态字节码技术
实现了AOP
AOP
是对OOP
的一个横向的补充,主要作用就是把一些业务无关
的功能抽离
出来
AOP 相关概念
Aspect
:切面;切入系统的一个切面。比如权限管理是一个切面,事务管理也是一个切面。包含着一些 Pointcut 以及相应的 Advice
Joinpoint
:连接点;可以进行横向切入的位置;典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等
Pointcut
:切入点;表示一组
joint point,它定义了相应的Advice
将要发生的地方
。
Advice
:通知;切面在某个连接点执行的操作
。它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
Target
:目标;被通知的对象,也就是包含连接点的对象。被称作被通知或被代理对象。
Introduction
:引入;在一些高级语言中,比如 Rudy 与 Groovy,都有开放类的概念,能够在不改变对象和类的代码的前提下,为对象和类添加新的方法。然而对于Java,他不是动态的,类一旦编译完成,就很难再为他添加新的功能。Introduction 就是在不改变一个现有类代码的情况下,为该类添加属性和方法,可以在无需修改现有类的前提下,让它们具有新的行为和状态。其实就是把切面
用到目标类
中。
AOP Proxy
:AOP 代理;AOP 框架创建的对象,包含通知。 在 Spring 中,AOP 代理可以是 JDK 动态代理或者 CGLIB 代理。
Weaving
:织入;把切面加入程序代码的过程。切面在指定的连接点被织入到目标对象中,在目标对象的生命周期(编译期、类加载期、运行期)里有多个点可以进行织入。Spring AOP 是在运行
的某个时刻被织入,在织入切面时,AOP容器会为目标对象
动态创建一个代理对象
。
应用场景
日志打印
统计数据
数据验证
安全控制
异常处理
事务处理
等等。这些功能都与某些核心业务无关,但又随处可见,如果都是复制粘贴就很麻烦,而且难以维护。把它们抽离出来,用动态
插入的方式嵌到各业务逻辑中。